package com.k.kc.util;

import java.util.Scanner;

/**
 * @author net
 */
public class RiLi {

    /**
     * 此方法用于从控制台输入年、月
     **/
    public static void inputYearAndMonth() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年");
        int year = sc.nextInt();
        System.out.println("请输入月");
        int month = sc.nextInt();
        printRiLiRow6Column7(year, month);
    }

    /**
     * 固定7列 周一至周日
     * 打印日历
     **/
    public static void printRiLi(int year, int month) {
        //一周七天，定义一个计数器，打印一天加1（包括空白）如果%7等于0的话就需要换行
        int count = 0;
        System.out.println(year + "年" + month + "月的日历表");
        System.out.println();
        System.out.println("一\t二\t三\t四\t五\t六\t日");
        for (int i = 1; i <= getSpace(year, month); i++) {
            count += 1;
        }
        // 本月第一周不足7天, 补足上个月最后的几天补齐
        fillPreMonth(year,month,count);
        for (int i = 1; i <= DateUtils.getDaysOfMonth(year, month); i++) {
            System.out.print(i + "\t");
            count += 1;
            if (count % 7 == 0) {
                System.out.println();
            }
        }
        fillNexMonth(year,month,7-(count%7));
        // 本月最后一周不足7天,补足下个月开始的几天补齐
    }

    /**
     * 固定 6行 7列,不足补齐 仿照win10日历 2022/1 最多是6行 最少是 4行
     */
    private static void printRiLiRow6Column7(int year,int month){
        //一周七天，定义一个计数器，打印一天加1（包括空白）如果%7等于0的话就需要换行
        int count = 0;
        System.out.println(year + "年" + month + "月的日历表");
        System.out.println();
        System.out.println("一\t二\t三\t四\t五\t六\t日");
        for (int i = 1; i <= getSpace(year, month); i++) {
            count += 1;
        }
        // 本月开始不足上月数据,本月第一周不足7天, 补足上个月最后的几天补齐
        fillPreMonth(year,month,count);

        // 本月日历
        for (int i = 1; i <= DateUtils.getDaysOfMonth(year, month); i++) {
            System.out.print(i + "\t");
            count += 1;
            if (count % 7 == 0) {
                System.out.println();
            }
        }
        // 本月结尾补足下月数据, 不足6行,补足6行
        {
            int myCount = 42-count;
//            int myMonth = month==12?1:month+1;
//            int myYear = month==12?year+1:year;
            // 无需计算 下个月总天数了,只需要从1递增补齐即可
            for(int i=0;i<myCount;i++){
                int day = i+1;
                System.out.print(day+"\t");
                count +=1;
                if(count%7==0){
                    System.out.println();
                }
            }
        }
    }

    public static void fillPreMonth(int year,int month,int lastMonthFillDays){
        //跨上一年
        int myMonth = month==1?12:month-1;
        int myYear = month==1?year-1:year;
        int myDay;
        // 填充上个月的后几天补充次月前面空白
        int totalDays = DateUtils.getDaysOfMonth(myYear,myMonth);
        int[] totalDaysArr = intToArray(totalDays);
        for(int i=0;i<lastMonthFillDays;i++){
            myDay = totalDaysArr[totalDays-lastMonthFillDays+i];
            System.out.print(myDay+"\t");
        }
    }
    public static void fillNexMonth(int year,int month,int nextMonthFillDays){
        // 跨下一年问题
        int myMonth = month==12?1:month+1;
        int myYear = month==12?year+1:year;
        int myDay;
        int totalDays = DateUtils.getDaysOfMonth(myYear, myMonth);
        int[] totalDaysArr = intToArray(totalDays);
        for(int i=0;i<nextMonthFillDays;i++){
            myDay= totalDaysArr[i];
            System.out.print(myDay+"\t");
        }
        System.out.println();
    }

    public static int[] intToArray(int a){
        int[] arr = new int[a];
        for(int i=0;i<a;i++){
            arr[i] = i+1;
        }
        return arr;
    }

    /**
     * 获得自1900年至当前年、月经过的总天数
     * 实现：1900年到year - 1 年的总天数
     * 当年至month - 1 的总在数
     * 两个天数之和相加
     **/
    public static int getTotalDays(int year, int month) {
        int daysofyear = 0;
        int daysofmonth = 0;
        for (int i = 1900; i < year; i++) {
            daysofyear += DateUtils.isLoopYear(i) ? 366 : 365;
        }
        for (int i = 1; i < month; i++) {
            daysofmonth += DateUtils.getDaysOfMonth(year, i);
        }
        return daysofyear + daysofmonth;
    }

    /**
     * 利用总天数模7取余，得到所需要打印的空格数
     **/
    public static int getSpace(int year, int month) {
        return getTotalDays(year, month) % 7;
    }

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        int year =2024;
        int monthOfYear = 12;
        for(int i=1;i<=monthOfYear;i++){
            printRiLiRow6Column7(year,i);
        }
        long end = System.currentTimeMillis();
        System.out.println(end-start);
    }
}